import { useAIStore } from '@/stores'
import { AIProviderFactory } from './providers'

// 添加检查和纠正模型的函数
function validateAndFixModel(model: string): string {
  console.log(`用户选择的模型: ${model}`)
  return model
}

export interface AIStreamOptions {
  prompt: string | Array<{ role: string, content: string }> | {
    system?: string
    user?: string
  }
  onToken?: (token: string) => void
  onError?: (error: Error) => void
  onFinish?: () => void
}

export async function streamAIContent({
  prompt,
  onToken,
  onError,
  onFinish,
}: AIStreamOptions) {
  const aiStore = useAIStore()
  
  try {
    // 验证必要的配置
    if (!aiStore.apiKey) {
      throw new Error(`请先设置 API Key`)
    }

    // 记录使用的模型
    const selectedModel = aiStore.customModel || aiStore.selectedModel
    console.log(`使用的模型：${selectedModel}`)
    const validatedModel = validateAndFixModel(selectedModel)
    
    // 获取当前提供商工厂
    const providerFactory = AIProviderFactory.getInstance()
    
    // 获取当前提供商ID和实例
    const providerId = aiStore.selectedProviderId
    const provider = providerFactory.getProvider(providerId)
    
    if (!provider) {
      throw new Error(`未找到ID为 ${providerId} 的服务提供商`)
    }
    
    console.log(`使用服务提供商: ${provider.name}`)
    
    // 调用提供商的流式内容方法
    await provider.streamContent({
      prompt,
      apiKey: aiStore.apiKey,
      baseUrl: aiStore.apiDomain,
      model: validatedModel,
      presetWords: aiStore.presetWords,
      onToken,
      onError,
      onFinish,
      setGenerating: (status: boolean) => aiStore.setGenerating(status)
    })
  }
  catch (error) {
    aiStore.setGenerating(false)
    console.error(`AI 请求失败:`, {
      错误信息: error instanceof Error ? error.message : String(error),
      模型: aiStore.customModel || aiStore.selectedModel,
      提供商: aiStore.selectedProviderId
    })
    onError?.(error instanceof Error ? error : new Error(String(error)))
  }
}

export function generateWithAI(prompt: string): Promise<string> {
  return new Promise((resolve, reject) => {
    let content = ``

    streamAIContent({
      prompt,
      onToken: (token) => {
        content += token
      },
      onError: (error) => {
        reject(error)
      },
      onFinish: () => {
        resolve(content)
      },
    })
  })
}

// CSS改写相关的提示词模板
export const CSS_REWRITE_PROMPTS = {
  optimize: `优化CSS结构,使用更合理的选择器和层级`,
  readability: `提高代码可读性,添加适当的空行和缩进`,
  simplify: `精简代码,去除冗余的样式声明`,
  comment: `为重要的样式块添加注释说明`,
  selectors: `保持原有的选择器名称不变`,
  important: `保留所有!important声明`,
  media: `保留所有媒体查询`,
  animation: `保留所有动画相关代码`,
}

// 生成CSS改写提示词
export function generateCssRewritePrompt(options: {
  styles: string[]
  retains: string[]
  css: string
  customPrompt?: string
}) {
  const { styles, retains, css, customPrompt } = options

  // 基础提示词
  const basePrompt = [
    `你是一个专业的CSS优化专家。你的任务是根据以下要求优化CSS代码:`,
    ``,
    `优化要求:`,
  ]

  // 添加优化选项
  styles.forEach((style) => {
    if (CSS_REWRITE_PROMPTS[style as keyof typeof CSS_REWRITE_PROMPTS]) {
      basePrompt.push(`- ${CSS_REWRITE_PROMPTS[style as keyof typeof CSS_REWRITE_PROMPTS]}`)
    }
  })

  // 添加保留选项
  if (retains.length > 0) {
    basePrompt.push(``, `保留要求:`)
    retains.forEach((retain) => {
      if (CSS_REWRITE_PROMPTS[retain as keyof typeof CSS_REWRITE_PROMPTS]) {
        basePrompt.push(`- ${CSS_REWRITE_PROMPTS[retain as keyof typeof CSS_REWRITE_PROMPTS]}`)
      }
    })
  }

  // 添加自定义提示词
  if (customPrompt?.trim()) {
    basePrompt.push(
      ``,
      `自定义要求:`,
      customPrompt.trim(),
    )
  }

  // 添加处理说明
  basePrompt.push(
    ``,
    `请严格按照以下步骤处理:`,
    `1. 仔细阅读上述优化和保留要求`,
    `2. 分析CSS代码的结构和特点`,
    `3. 根据要求优化代码,同时确保保留指定的特性`,
    `4. 检查优化后的代码是否符合所有要求`,
    ``,
    `需要优化的CSS代码:`,
    ``,
    css,
    ``,
    `请开始优化:`,
  )

  return {
    system: basePrompt.join(`\n`),
    user: css,
  }
}

// AI 服务接口
export async function callAI(prompt: string): Promise<string> {
  const aiStore = useAIStore()
  try {
    // 验证必要的配置
    if (!aiStore.apiKey) {
      throw new Error(`请先设置 API Key`)
    }

    // 记录使用的模型
    const selectedModel = aiStore.customModel || aiStore.selectedModel
    console.log(`callAI使用的模型：${selectedModel}`)
    const validatedModel = validateAndFixModel(selectedModel)
    
    // 获取当前提供商工厂
    const providerFactory = AIProviderFactory.getInstance()
    
    // 获取当前提供商ID和实例
    const providerId = aiStore.selectedProviderId
    const provider = providerFactory.getProvider(providerId)
    
    if (!provider) {
      throw new Error(`未找到ID为 ${providerId} 的服务提供商`)
    }
    
    console.log(`callAI使用服务提供商: ${provider.name}`)
    
    // 调用提供商的非流式内容方法 - 修复参数调用
    return await provider.callContent(prompt, aiStore.apiKey, aiStore.apiDomain)
  }
  catch (error) {
    console.error(`调用 AI 服务失败:`, error)
    throw error
  }
}
